Redis Streams Redis 5.0 এ পরিচিত একটি নতুন ডেটা স্ট্রাকচার, যা একটি log-based ডেটা স্ট্রাকচার হিসেবে কাজ করে। এটি রিয়েল-টাইম ডেটা স্ট্রিমিং এবং মেসেজিং সিস্টেমে ব্যবহৃত হয় এবং কমপ্লেক্স ডেটা সিকোয়েন্স বা বার্তা প্রক্রিয়াকরণ করতে সক্ষম। Redis Streams-এর মাধ্যমে, ডেটা সহজেই গ্রুপে ভাগ করা যায় এবং প্রসেসিং করা যায়, যা pub/sub (Publish/Subscribe) এর তুলনায় আরও উন্নত এবং স্কেলেবল।
Redis Streams হলো একটি log-structured ডেটা স্ট্রাকচার যা ডেটার ধারাবাহিক প্রবাহ (stream) সংরক্ষণ করে। এটি মেসেজের একটি সিরিজ সংরক্ষণ করে, এবং প্রতিটি মেসেজের সাথে একটি ইউনিক আইডেন্টিফায়ার (ID) অ্যাসোসিয়েট থাকে।
Redis Streams ব্যবহার করা হয়:
ID
দিয়ে চিহ্নিত হয়, যা সাধারণত একটি টাইমস্ট্যাম্প বা সিকোয়েন্স নম্বর হতে পারে। একটি Stream-এর মধ্যে বিভিন্ন মেসেজ রাখা হয়, এবং নতুন মেসেজটি শেষের দিকে যুক্ত হয়।Redis Streams ব্যবহার করে একটি Stream তৈরি করতে, আপনি XADD
কমান্ড ব্যবহার করতে পারেন। এই কমান্ডের মাধ্যমে আপনি নতুন মেসেজ স্ট্রিমে যোগ করতে পারবেন।
XADD mystream * message "Hello Redis Streams"
এই কমান্ডের মাধ্যমে mystream
নামে একটি স্ট্রিম তৈরি করা হবে এবং "Hello Redis Streams"
মেসেজ স্ট্রিমে যোগ হবে। এখানে *
হল টাইমস্ট্যাম্প এবং সিকোয়েন্স আইডি স্বয়ংক্রিয়ভাবে নির্ধারণ করার জন্য ব্যবহৃত।
XRANGE mystream - +
এটি mystream
স্ট্রিম থেকে সমস্ত মেসেজ পড়বে, যেখানে -
এবং +
মানে শুরু এবং শেষের মধ্যে সমস্ত মেসেজ।
একাধিক কনজিউমার ব্যবহার করার জন্য একটি Consumer Group তৈরি করা যেতে পারে। উদাহরণস্বরূপ:
XGROUP CREATE mystream mygroup $ MKSTREAM
এটি mystream
স্ট্রিমের জন্য mygroup
নামে একটি কনজিউমার গ্রুপ তৈরি করবে। $
ব্যবহার করা হলে, এটি নতুন মেসেজের জন্য কনজিউমার গ্রুপের প্রথম মেসেজ শুরু করবে।
XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
এটি কনজিউমার গ্রুপ mygroup
থেকে consumer1
নামে কনজিউমারকে মেসেজ পাঠাবে এবং পরবর্তী মেসেজ পর্যন্ত ব্লক করবে।
যত দ্রুত একটি কনজিউমার মেসেজটি গ্রহণ করে, তত দ্রুত তা ACK (Acknowledgement) করতে হবে, যাতে Redis বুঝতে পারে যে মেসেজটি প্রসেস করা হয়েছে এবং কনজিউমারের পরবর্তী মেসেজ প্রাপ্তি শুরু হতে পারে।
XACK mystream mygroup 1538686111523-0
এটি mygroup
গ্রুপের জন্য mystream
থেকে মেসেজ 1538686111523-0
সফলভাবে প্রসেস করার পর ACK করবে।
Redis Streams একটি অত্যন্ত শক্তিশালী ডেটা স্ট্রাকচার যা ডেটা স্ট্রিমিং, মেসেজিং, এবং রিয়েল-টাইম ডেটা প্রসেসিংয়ের জন্য ব্যবহার করা হয়। এটি Consumer Groups, Message Acknowledgment, এবং Efficient Range Queries এর মাধ্যমে একটি শক্তিশালী এবং স্কেলেবল সিস্টেম গড়ে তোলে। Redis Streams বিভিন্ন বাস্তব সময়ের ব্যবহারে কাজে লাগানো যেতে পারে, যেমন ইভেন্ট ট্র্যাকিং, মেসেজ ব্রোকারিং, ডেটা সিঙ্ক্রোনাইজেশন ইত্যাদি।
Redis Streams হল একটি ডেটা স্ট্রাকচার যা রেডিস 5.0 তে নতুন করে যোগ করা হয়েছে, এবং এটি মূলত log-like ডেটা সঞ্চয়ের জন্য ব্যবহৃত হয়। Redis Streams ডেটার স্ট্রিমিং এবং রিয়েল-টাইম ডেটা প্রসেসিংয়ের জন্য আদর্শ। এটি একাধিক প্রযোজ্য ক্ষেত্রে যেমন ইভেন্ট সোরসিং, মেসেজিং সিস্টেম, এবং কিউ ম্যানেজমেন্টে ব্যবহৃত হতে পারে।
Redis Streams মূলত একটি log-based data structure, যেখানে ডেটা টাইমস্ট্যাম্প এবং ইউনিক আইডি দিয়ে সংরক্ষিত থাকে, এবং এই ডেটা ক্রমাগতভাবে আপডেট ও অ্যাক্সেস করা যেতে পারে। এটি Pub/Sub মডেলের তুলনায় একটু বেশি উন্নত, কারণ এখানে একাধিক Consumers এবং Consumer Groups হতে পারে, যারা একাধিক Messages বা Events প্রক্রিয়া করতে পারে।
Redis Streams ব্যবহার করার জন্য কিছু গুরুত্বপূর্ণ কমান্ড রয়েছে। এখানে XADD, XREAD, XGROUP এবং XACK কমান্ডগুলোর ব্যবহার আলোচনা করা হচ্ছে।
XADD
কমান্ডের মাধ্যমে একটি নতুন মেসেজ স্ট্রিমে যোগ করা হয়। এটি স্ট্রিমের শেষের দিকে নতুন মেসেজ যুক্ত করে।
XADD mystream * message "Hello, Redis Streams!"
mystream
: স্ট্রিমের নাম।*
: টাইমস্ট্যাম্প এবং ইউনিক আইডি যুক্ত হবে, যা স্বয়ংক্রিয়ভাবে তৈরি হয়।message
: মেসেজ বা ডেটা।এটি একটি নতুন মেসেজ স্ট্রিমে যোগ করবে এবং স্বয়ংক্রিয়ভাবে একটি স্ট্রিম আইডি তৈরি হবে।
XREAD
কমান্ড ব্যবহার করে স্ট্রিম থেকে মেসেজ পড়া হয়। এটি ব্লকিং বা নন-ব্লকিং রিড অপারেশন সাপোর্ট করে।
XREAD COUNT 2 BLOCK 0 STREAMS mystream $
COUNT 2
: সর্বোচ্চ ২টি মেসেজ পড়বে।BLOCK 0
: ব্লকিং রিড (0 মানে ইনফিনিট ব্লক করবে যতক্ষণ না নতুন মেসেজ আসে)।STREAMS mystream $
: mystream
স্ট্রিম থেকে রিড করা হবে এবং $
নির্দেশনা দিয়ে স্ট্রিমের সর্বশেষ মেসেজ থেকে রিড শুরু হবে।Redis Streams-এ Consumer Group তৈরি করা হয়, যেখানে একাধিক কনজিউমার একই স্ট্রিম থেকে মেসেজ গ্রহণ করতে পারে। XGROUP
কমান্ডের মাধ্যমে একটি কনজিউমার গ্রুপ তৈরি করা হয়।
XGROUP CREATE mystream mygroup $ MKSTREAM
mystream
: স্ট্রিমের নাম।mygroup
: কনজিউমার গ্রুপের নাম।$
: কনজিউমার গ্রুপ নতুন মেসেজগুলি পড়বে।একটি মেসেজ সফলভাবে কনজিউম করার পর, কনজিউমারদের acknowledge করা প্রয়োজন। এটি করার জন্য XACK
কমান্ড ব্যবহার করা হয়।
XACK mystream mygroup 1526569495631-0
mystream
: স্ট্রিমের নাম।mygroup
: কনজিউমার গ্রুপের নাম।1526569495631-0
: স্ট্রিমের মেসেজ আইডি (যা XADD
কমান্ডের মাধ্যমে সৃষ্টি হয়েছে)।XTRIM
কমান্ড ব্যবহার করে স্ট্রিমের সাইজ সীমাবদ্ধ করা যায়। এটি স্ট্রিমের পুরনো মেসেজগুলো মুছে ফেলে।
XTRIM mystream MAXLEN 1000
MAXLEN 1000
: স্ট্রিমে সর্বোচ্চ 1000 মেসেজ থাকতে দেবে, পুরনো মেসেজগুলো মুছে ফেলা হবে।Redis Streams একটি শক্তিশালী ডেটা স্ট্রাকচার যা রিয়েল-টাইম ডেটা প্রসেসিং এবং মেসেজিং সিস্টেমে ব্যবহৃত হয়। এটি log-based স্টোরেজ পদ্ধতি ব্যবহার করে যেখানে প্রতিটি মেসেজ একটি টাইমস্ট্যাম্প এবং ইউনিক আইডি দ্বারা চিহ্নিত হয়। Redis Streams-এ Consumer Groups ব্যবহার করে একাধিক কনজিউমার একই ডেটা স্ট্রিম থেকে মেসেজ গ্রহণ করতে পারে। এটি Event Sourcing, Message Queuing, এবং Real-Time Data Processing এর মতো ক্ষেত্রে ব্যবহৃত হতে পারে।
Redis Streams হল Redis-এর একটি ডেটা স্ট্রাকচার যা লজিক্যাল অর্ডারে ডেটা সংরক্ষণ এবং পরিচালনা করতে ব্যবহৃত হয়। এর মাধ্যমে রিয়েল-টাইম ডেটা স্ট্রিমিং, মেসেজ ব্রোকারিং এবং ইভেন্ট সোরিং সহজ হয়। Redis Streams-এর মধ্যে XADD, XREAD, এবং XGROUP হল তিনটি গুরুত্বপূর্ণ কমান্ড, যা স্ট্রিম ডেটা ম্যানিপুলেশন, পাঠানো এবং গ্রুপের মাধ্যমে স্ট্রিম রিড করতে ব্যবহৃত হয়।
এখানে প্রতিটি কমান্ডের বিস্তারিত ব্যাখ্যা দেওয়া হল:
XADD কমান্ডটি Redis Streams-এ নতুন মেসেজ (এলিমেন্ট) যোগ করতে ব্যবহৃত হয়। স্ট্রিমে ডেটা যোগ করার সময়, একটি গাইডেড আইডেন্টিফায়ার (স্ট্রিম আইডি) স্বয়ংক্রিয়ভাবে তৈরি হয়, তবে আপনি চাইলে একটি কাস্টম আইডি ব্যবহার করতে পারেন।
XADD <stream_name> <field1> <value1> <field2> <value2> ...
<stream_name>
: স্ট্রিমের নাম।<field1> <value1>
: স্ট্রিমের ফিল্ড এবং তার মান।XADD mystream * name "John Doe" age 30
এখানে, mystream
নামে একটি স্ট্রিমে দুটি ফিল্ড (name, age) যোগ করা হয়েছে। *
স্ট্রিম আইডি হিসেবে একটি স্বয়ংক্রিয় টাইমস্ট্যাম্প ব্যবহার করে।
আউটপুট:
"1625077862030-0"
এটি স্ট্রিম আইডি, যা Redis দ্বারা তৈরি করা হয় এবং এটি স্ট্রিমের মধ্যে ডেটার লজিক্যাল অর্ডার বজায় রাখে।
MAXLEN: একটি সীমা নির্ধারণ করা, যার মাধ্যমে স্ট্রিমে শুধুমাত্র সর্বাধিক নির্দিষ্ট সংখ্যা পর্যন্ত আইটেম রাখা হয় এবং পুরনো আইটেমগুলি অটোমেটিকালি মুছে যায়।
XADD mystream MAXLEN 1000 * name "Alice" age 25
XREAD কমান্ডটি Redis Streams থেকে ডেটা রিড করতে ব্যবহৃত হয়। এটি আপনাকে একটি বা একাধিক স্ট্রিম থেকে ডেটা অ্যাক্সেস করতে দেয় এবং চূড়ান্ত ডেটা (ইভেন্ট) রিটার্ন করে।
XREAD BLOCK <milliseconds> STREAMS <stream1> <stream2> ... <count> <count>
XREAD BLOCK 0 STREAMS mystream 0
এটি mystream
থেকে সর্বশেষ ডেটা রিড করবে এবং যদি নতুন ডেটা না থাকে, তাহলে এটি ইনফিনিট সময়ের জন্য ব্লক করবে। 0
এখানে নির্দেশ করে যে, প্রথম থেকেই ডেটা রিড করতে হবে।
1) 1) "mystream"
2) 1) "1625077862030-0"
2) 1) "name"
2) "John Doe"
3) 1) "age"
2) "30"
এখানে, mystream
থেকে ডেটা রিড করা হয়েছে এবং প্রত্যেকটি ইভেন্টের সাথে তার স্ট্রিম আইডি, ফিল্ড এবং মান দেখানো হয়েছে।
XGROUP কমান্ডটি Redis Streams-এ Consumer Group তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। Consumer Groups Redis Streams-এর একটি শক্তিশালী বৈশিষ্ট্য, যা একাধিক কনজিউমার (গ্রাহক) বা কনজিউমার গ্রুপের মাধ্যমে ডেটা প্রক্রিয়া করার সুবিধা দেয়।
XGROUP CREATE <stream_name> <group_name> <ID>
XGROUP CREATE mystream mygroup 0
এটি mystream
নামক স্ট্রিমে mygroup
নামে একটি কনজিউমার গ্রুপ তৈরি করবে এবং প্রথম থেকে ডেটা রিড করবে। গ্রুপের উদ্দেশ্য হল একাধিক কনজিউমারের মধ্যে ডেটা ভাগ করে দেওয়া।
একবার কনজিউমার গ্রুপ তৈরি হলে, আপনি গ্রুপের মাধ্যমে ডেটা রিড করতে পারেন XREADGROUP
কমান্ড ব্যবহার করে। এটি একটি নির্দিষ্ট গ্রুপের সদস্যদের জন্য ডেটা পাঠায়।
XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
এখানে, consumer1
হল গ্রুপের সদস্য, যা ডেটা রিড করবে। BLOCK 0
নির্দেশ করে যে, এটি চিরকাল ব্লক করবে যতক্ষণ না নতুন ডেটা আসে, এবং >
নির্দেশ করে যে, এটি শুধুমাত্র নতুন ডেটা রিড করবে।
1) 1) "mystream"
2) 1) "1625077862030-0"
2) 1) "name"
2) "Alice"
3) 1) "age"
2) "25"
XADD mystream * name "John" age 25
XREAD BLOCK 0 STREAMS mystream 0
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
Redis Streams একটি শক্তিশালী ডেটা স্ট্রাকচার যা রিয়েল-টাইম ডেটা প্রক্রিয়াকরণ এবং স্কেলেবেল মেসেজিং সিস্টেম তৈরি করতে ব্যবহৃত হয়। XADD
, XREAD
, এবং XGROUP
কমান্ডগুলি এই স্ট্রিম ডেটা পরিচালনা করতে সহায়ক এবং খুবই কার্যকরী।
Redis Streams হল Redis-এর একটি শক্তিশালী ডেটা স্ট্রাকচার যা message queueing, event streaming, এবং data processing এর জন্য ব্যবহৃত হয়। Redis Streams-এর মাধ্যমে আপনি একটি stream তৈরি করতে পারেন, যেখানে বিভিন্ন producers (পাবলিশার্স) ডেটা পাবলিশ করে এবং consumers (সাবস্ক্রাইবাররা) সেই ডেটা প্রসেস করে। Redis Streams খুব কার্যকরী হতে পারে যখন আপনি রিয়েল-টাইম ডেটা প্রসেসিং, অ্যাসিঙ্ক্রোনাস মেসেজিং বা লগিং সিস্টেম তৈরি করতে চান।
Redis Streams একটি log-based data structure যা একটি ordered sequence of messages বা events ধারণ করে। প্রতিটি message বা event একটি unique ID দিয়ে চিহ্নিত হয়, যা time-based হয় এবং একটি message payload ধারণ করে। Redis Streams-এর মাধ্যমে আপনি একটি Producer-Consumer মডেল তৈরি করতে পারেন যেখানে একাধিক producer এবং consumer অ্যাপ্লিকেশন একযোগে ডেটা প্রক্রিয়া করে।
Redis Streams এর মূল কমান্ডগুলো হলো:
ধরা যাক, আপনি একটি Producer-Consumer মডেল তৈরি করতে চান যেখানে producer ডেটা পাবলিশ করবে এবং consumer সেই ডেটা প্রসেস করবে। নিচে Redis Streams ব্যবহার করে data processing এর একটি সাধারণ উদাহরণ দেয়া হল।
Producer সাধারণত ডেটা Streams-এ পাঠায়। এটি XADD
কমান্ড ব্যবহার করে স্ট্রিমে নতুন entry যোগ করে।
import redis
# Redis সার্ভারে কানেক্ট করা
r = redis.Redis(host='localhost', port=6379, db=0)
# নতুন ডেটা Streams-এ যোগ করা
stream_name = 'mystream'
message_id = r.xadd(stream_name, {'event': 'user_created', 'user_id': '1234', 'name': 'John Doe'})
print(f"Message added with ID: {message_id}")
stream_name
এর মধ্যে নতুন event পাঠানো হয়, যা একটি key-value পেয়ার হিসেবে থাকে।event
, user_id
এবং name
প্যারামিটার পাঠানো হচ্ছে।Consumer XREAD
কমান্ড ব্যবহার করে স্ট্রিম থেকে ডেটা পড়ে এবং প্রক্রিয়াকরণ করে। এটি XREAD
এর মাধ্যমে নতুন ডেটা পাওয়া গেলে তা প্রসেস করে।
import redis
# Redis সার্ভারে কানেক্ট করা
r = redis.Redis(host='localhost', port=6379, db=0)
# স্ট্রিম থেকে ডেটা পড়া
stream_name = 'mystream'
while True:
# নতুন ডেটা আসলে XREAD কমান্ড ব্যবহার করে পড়া
messages = r.xread({stream_name: '0'}, count=1, block=0)
for message in messages:
message_id, message_data = message
print(f"New message from {stream_name}: {message_data}")
# এখানে ডেটা প্রসেস করতে পারেন
user_id = message_data.get(b'user_id').decode('utf-8')
name = message_data.get(b'name').decode('utf-8')
print(f"Processing user: {user_id}, Name: {name}")
# Acknowledge message after processing
r.xack(stream_name, 'mygroup', message_id)
XREAD
কমান্ডের মাধ্যমে consumer স্ট্রিম থেকে ডেটা পড়বে।block=0
ব্যবহার করে লম্বা সময় ধরে ডেটা রিড করা যাবে।xack
কমান্ডের মাধ্যমে, ডেটা প্রসেস করার পরে consumer তা ack করে দেয়, যাতে consumer group পরবর্তী বার্তা গ্রহণ করতে পারে।Redis Streams-এ Consumer Groups ব্যবহৃত হয়, যেখানে একাধিক consumer একসাথে স্ট্রিমের ডেটা প্রক্রিয়া করতে পারে। এটি workload distribution এবং fault tolerance নিশ্চিত করে।
r.xgroup_create('mystream', 'mygroup', id='0', make_stream=True)
mystream
স্ট্রিমের জন্য mygroup
নামে একটি consumer group তৈরি করা হয়েছে।id='0'
দ্বারা বলা হচ্ছে যে গ্রুপটি সমস্ত স্ট্রিম ডেটা শুরু থেকে গ্রহণ করবে।make_stream=True
মানে, যদি স্ট্রিমটি আগে থেকে না থাকে, তবে এটি তৈরি করা হবে।while True:
# গ্রুপের মাধ্যমে ডেটা রিড করা
messages = r.xreadgroup('mygroup', 'consumer1', {stream_name: '>'}, count=1, block=0)
for message in messages:
message_id, message_data = message
print(f"New message: {message_data}")
# এখানে ডেটা প্রসেস করতে পারেন
user_id = message_data.get(b'user_id').decode('utf-8')
name = message_data.get(b'name').decode('utf-8')
print(f"Processing user: {user_id}, Name: {name}")
# Acknowledge message after processing
r.xack(stream_name, 'mygroup', message_id)
'>
' এর মাধ্যমে এটি নতুন ডেটা গ্রহণ করে, এবং প্রতিটি message প্রক্রিয়া করার পরে XACK
কমান্ড ব্যবহার করে তা ack করা হয়।স্ট্রিমের আকার বড় হতে পারে, তাই আপনি পুরনো ডেটা মুছে ফেলতে XTRIM ব্যবহার করতে পারেন।
r.xtrim('mystream', minid='1000', approximate=False)
এটি mystream
স্ট্রিম থেকে 1000 এর চেয়ে পুরনো ডেটা মুছে ফেলবে।
স্ট্রিমের ডেটা ব্যাচ আকারে প্রক্রিয়া করতে পারেন। এতে একাধিক ডেটা একত্রে প্রসেস করা হয় এবং তা performance ভালো হতে পারে।
messages = r.xread({stream_name: '0'}, count=10, block=0)
for message in messages:
# এখানে ব্যাচ প্রসেসিং করা হবে
print(message)
Redis Streams একটি শক্তিশালী ডেটা স্ট্রাকচার যা মেসেজ কিউইং এবং রিয়েল-টাইম ডেটা প্রসেসিংয়ে ব্যবহৃত হয়। আপনি Producer-Consumer মডেল ব্যবহার করে স্ট্রিমের মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে পারেন। Consumer Groups ব্যবহার করলে একাধিক consumer একই স্ট্রিম থেকে ডেটা প্রসেস করতে পারে, যা কার্যকারিতা বৃদ্ধি এবং ফেইলওভার সুবিধা দেয়। Redis Streams পারফরম্যান্স অপটিমাইজেশন এবং ডেটা ম্যানিপুলেশন নিশ্চিত করার জন্য বিভিন্ন কৌশল ব্যবহার করা যায়, যেমন batch processing, stream trimming, এবং XACK.
Redis Streams এবং Pub/Sub (Publish/Subscribe) দুটি messaging প্যাটার্ন হলেও, এদের মধ্যে বেশ কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। এই দুইটি মডেল রেডিসে মেসেজিং, ডেটা ফ্লো এবং কমিউনিকেশন ব্যবস্থার জন্য ব্যবহৃত হয়, তবে তাদের উদ্দেশ্য, কার্যকারিতা এবং ব্যবহার ক্ষেত্র ভিন্ন। নিচে বিস্তারিতভাবে Streams এবং Pub/Sub এর পার্থক্য তুলে ধরা হলো:
Feature | Pub/Sub | Streams |
---|---|---|
Purpose | Real-time messaging & notifications | Event sourcing & message queues |
Message Persistence | No persistence (messages are lost) | Persistent messages (log-based) |
Message Ordering | No guaranteed ordering | Guaranteed ordering |
Acknowledgment | No message acknowledgment | Message acknowledgment supported |
Use Cases | Chat, notifications, live updates | Event sourcing, message queues, logs |
Scalability | Limited, can be challenging | Highly scalable with consumer groups |
Reliability | Low, messages may be missed | High, reliable with message persistence |
আপনার অ্যাপ্লিকেশনের প্রয়োজন অনুসারে এই দুটি পদ্ধতির মধ্যে সঠিকটি বেছে নিন।
Read more